#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <cstring>
#include <string>
#include <sys/types.h>
#include <sys/wait.h>

#define G_ARGC 50

#define COMMAND_SIZE 1024 

#define SEP " "

char command[COMMAND_SIZE];

int g_argc = 0;
char* g_argv[G_ARGC];

const char* GetUSER()
{
	char* ret = getenv("USER");

	return ret == nullptr ? "None" : ret;
}

const char* GetHOSTNAME()
{
	char* ret = getenv("HOSTNAME");

	return ret == nullptr ? "None" : ret;
}

const char* GetPWD()
{
	char* ret = getenv("PWD");

	return ret == nullptr ? "None" : ret;
}

void Print_Command_Front()
{
	snprintf(command,sizeof(command),"%s@%s%s$",GetUSER(),GetHOSTNAME(),GetPWD());

	printf("%s",command);
}

void Line_Separa(char* str,int len);

void GetCOMMAND_LINE()
{
	char str[100];
	// fgets()函数返回值为读取到的内容。
	char* c = fgets(str,sizeof(str),stdin);

//	printf("%s\n",c);

	if(c == nullptr)
	{
		 exit(2);
	}

	int len = strlen(str);
	// 去除掉输入的'\n',打印好命令行。
	str[--len] = 0;
	
	Line_Separa(str,len);
	

// 使用v-block模式,ctrl+v选中要填充的部分，再shift + i = I,输入要填充的文字，再按ESC。
//	for(int i = 0;i < g_argc;++i)
//	{
//		printf("g_argv[%d] : %s\n",i,g_argv[i]);
//	}
}

// 命令行解析
void Line_Separa(char* str,int len)
{
	// 对数组进行清零。
	g_argc = 0;

	g_argv[g_argc++] = strtok(str,SEP);
	while(g_argv[g_argc++] = strtok(NULL,SEP))
	{
		;
	}
	--g_argc;
}

// 执行代码
void Run()
{
	// 创建子进程，用子进程执行代码，从而不影响父进程。
	pid_t id = fork();
	
	// 判断是不是子进程。
	if(id == 0)
	{
		int ret = execvp(g_argv[0],g_argv);
		if(ret == -1)
		{
			exit(2);
		}

		// 子进程退出。
		exit(0);
	}
	
	// 父进程等待子进程响应。
	// 否则父进程就将子进程响应当输入了。
	waitpid(id,nullptr,0);
}

int main()
{
	while(true)
	{
		// 打印前缀
		Print_Command_Front();
	
		// 输入命令,命令行解析。
		GetCOMMAND_LINE();

		if(g_argv[0] == nullptr)
		{
			continue;
		}
	
		// 执行命令行
		Run();
	}


	return 0;
}
